using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Features
{
    /// <summary>
    /// <para>Dice</para>
    /// <para>Subdivides a feature into smaller features based on a specified vertex limit. This tool is intended as a way to subdivide extremely large features that cause issues with drawing, analysis, editing, and/or performance but are difficult to split up with standard editing and geoprocessing tools. This tool should not be used in any cases other than those where tools are failing to complete successfully due to the size of features.</para>
    /// <para>根据指定的顶点限制将要素细分为较小的要素。此工具旨在细分导致绘制、分析、编辑和/或性能问题但难以使用标准编辑和地理处理工具拆分的超大要素。除由于要素大小而无法成功完成工具的情况外，不应在任何其他情况下使用此工具。</para>
    /// </summary>    
    [DisplayName("Dice")]
    public class Dice : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Dice()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The input feature class or feature layer. The geometry type must be multipoint, line, or polygon.</para>
        /// <para>输入要素类或要素图层。几何类型必须为多点、直线或多边形。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class of diced features.</para>
        /// <para>切块要素的输出要素类。</para>
        /// </param>
        /// <param name="_vertex_limit">
        /// <para>Vertex Limit</para>
        /// <para>Features with geometries that exceed this vertex limit will be subdivided before being written to the output feature class.</para>
        /// <para>几何超过此折点限制的要素在写入输出要素类之前将被细分。</para>
        /// </param>
        public Dice(object _in_features, object _out_feature_class, long? _vertex_limit)
        {
            this._in_features = _in_features;
            this._out_feature_class = _out_feature_class;
            this._vertex_limit = _vertex_limit;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Dice";

        public override string CallName => "management.Dice";

        public override List<string> AcceptEnvironments => ["autoCommit", "configKeyword", "qualifiedFieldNames"];

        public override object[] ParameterInfo => [_in_features, _out_feature_class, _vertex_limit];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input feature class or feature layer. The geometry type must be multipoint, line, or polygon.</para>
        /// <para>输入要素类或要素图层。几何类型必须为多点、直线或多边形。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class of diced features.</para>
        /// <para>切块要素的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Vertex Limit</para>
        /// <para>Features with geometries that exceed this vertex limit will be subdivided before being written to the output feature class.</para>
        /// <para>几何超过此折点限制的要素在写入输出要素类之前将被细分。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Vertex Limit")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public long? _vertex_limit { get; set; }


        public Dice SetEnv(int? autoCommit = null, object configKeyword = null, bool? qualifiedFieldNames = null)
        {
            base.SetEnv(autoCommit: autoCommit, configKeyword: configKeyword, qualifiedFieldNames: qualifiedFieldNames);
            return this;
        }

    }

}